#pragma once
#include <string>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>

class Until{
    public:
        //读取request一行数据
        static int ReadLine(int sock,std::string& out)
        {
            //逐字符一一读取
            char ch = 'X';
            while(ch != '\n')
            {
                ssize_t s = recv(sock,&ch,1,0);
                if(s > 0)
                {
                    if(ch == '\r')
                    {
                        //窥探\r的下一个字符:从接收缓冲区读取但并不拿走  MAG_PEEK
                        recv(sock,&ch,1,MSG_PEEK);
                        //\r\n -> \n
                        if(ch == '\n')
                        {
                            //从接收缓冲区读走下一个字符\n
                            recv(sock,&ch,1,0);
                        }
                        //下一个字符不是'\n',则直接将'\r'置为'\n'
                        else
                        {
                            ch = '\n';
                        }

                    }
                    //普通字符或'\n'
                    out.push_back(ch);
                }
                //对方关闭连接返回0
                else if(s == 0) 
                {
                    return 0;
                }
                //读取出错返回-1
                else
                {
                    return -1;
                }
            }
            //返回读取每行的字符数目
            return out.size();
        }
        //以sep字符串对目标target字符串进行分割,分割为sub1_out和sub2_out两个字符串
        static bool CutString(const std::string& target,std::string& sub1_out,std::string& sub2_out,std::string& sep)
        {
            //查找sep在目标字符串中的位置
            size_t pos = target.find(sep);
            if(pos != std::string::npos)
            {
                //使用substr方法分割字符串,substr(开始位置,字符个数) 
                sub1_out = target.substr(0,pos);
                sub2_out = target.substr(pos+sep.size());
                return true;
             }
             return false;
         }
};
